<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let person = {
            name: '张三',
            age: 123
        }
        // let p = {}
        //模拟vue2响应式
        //#region
        // Object.defineProperty(p, 'name', {
        //     get() {
        //         console.log('有人读取了name');
        //         return person.name
        //     },
        //     set(value) {
        //         console.log('@@@有人修改了name');
        //         person.name = value
        //     }
        // });
        // Object.defineProperty(p, 'age', {
        //     get() {
        //         console.log('有人读取了age');
        //         return person.age
        //     },
        //     set(value) {
        //         console.log('@@@有人修改了age');
        //         person.age = value
        //     }
        // })
        //#endregion

        //模拟vue3响应式
        //#region 
        const p = new Proxy(person, {
            get(target, propName) {
                console.log(`有人读取了p身上的${propName}属性`);
                return target[propName]
            },
            set(target, propName, value) {
                console.log(`有人修改了p上的${propName}属性`);
                target[propName] = value
            },
            deleteProperty(target, propName) {
                console.log(`有人删除了p上的${propName}属性`);
                return delete target[propName]
            }
        })
        //#endregion


        // 讲一讲reflect
        //#region
        // Reflect.defineProperty(p, 'name', {
        //     get() {
        //         console.log('有人读取了name');
        //         return person.name
        //     },
        //     set(value) {
        //         console.log('@@@有人修改了name');
        //         person.name = value
        //     }
        // });
        // Reflect.defineProperty(p, 'age', {
        //     get() {
        //         console.log('有人读取了age');
        //         return person.age
        //     },
        //     set(value) {
        //         console.log('@@@有人修改了age');
        //         person.age = value
        //     }
        // })
        //#endregion

        // reflect
        // const p = new Proxy(person, {
        //     get(target, propName) {
        //         console.log(`有人读取了p身上的${propName}属性`);
        //         return Reflect.get(target.propName)
        //     },
        //     set(target, propName, value) {
        //         console.log(`有人修改了p上的${propName}属性`);
        //         Reflect.set(target, propName, value)
        //     },
        //     deleteProperty(target, propName) {
        //         console.log(`有人删除了p上的${propName}属性`);
        //         return Reflect.deleteProperty(target, propName)
        //     }
        // })
    </script>
</body>

</html>